#include <bits/stdc++.h>
using namespace std;
const int N = 200001;
int sum[N];
int a[N];
long long f[N][2]; // f[i][0]:到了i物品，表示不放和放的情况
long long dp[N];

int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    sum[i] = sum[i - 1] + a[i];
  }

  // 初始条件

  f[0][0] = 0;
  f[0][1] = 0;
  for (int i = 1; i <= m - 1; ++i) {
    // i这个位置上共有两种情况：放或不放
    // 前面有dp[i - 1]种情况，因此一共有2*dp[i - 1]这么多种情况
    // 这是n小于m的情况，即不管怎么放，总不会爆炸
    dp[i] = 2 * dp[i - 1];
    f[i][0] = max(f[i - 1][0], f[i - 1][1]);
    f[i][1] = max(f[i - 1][0] + a[i], f[i - 1][1] + a[i]);
  }

  // 这种情况对应的是n正好等于m,这个时候我就需要在原来的基础上减去每个坑都放的这一种情况

  for (int i = m; i <= n; i++)
    // 现在是i>=m的情况，那么这种情况下，我就需要考虑减去前面所有会炸的情况了
    f[i][0] = max(f[i - 1][0], f[i - 1][1]);
    f[i][1] = max(f[i - 1][0] + a[i], f[i - 1][1] + a[i]);
 

  cout << dp[n];
  return 0;
}
